<?php

if (!defined('BASEPATH'))
    exit('No direct script access allowed');

class UserCP extends MY_Controller {

    public function __construct() {
        parent::__construct(Array("details", "groups"));
        if ($this->_loggedUser == NULL) {
            redirect("login");
        }
        $this->_data["menuHL"] = "Home";
        $this->addBreadCrumb("Home", site_url("home"));
        $this->addBreadCrumb("Control Panel", site_url("usercp"));
    }

    protected function _renderPage($page, $useLayout = true, $authorizedArr = Array()) {
        if ($this->_loggedUser == NULL) {
            redirect("login");
        } else {
            if ($useLayout) {
                $this->_data["page"] = $page;
                parent::_renderPage("usercp/base", $authorizedArr);
            } else {
                parent::_renderPage($page, $authorizedArr);
            }
        }
    }

    public function index() {
        $this->_data["pageTitle"] = "User Control Panel";
        $this->_renderPage("home");
    }

    // User CP

    public function updatePic() {
        $this->load->model("Image_model");
        $this->load->model("User_model");

        if ($this->_loggedUser->display_pic->id > 0) {
            $this->Image_model->updateFile($this->_loggedUser->display_pic->id, $this->input->post("tempfilename"));
        } else {
            $picId = $this->Image_model->create($this->input->post("tempfilename"), "", Array());
            if ($picId > 0) {
                $this->User_model->updateById($this->_loggedUser->id, Array("display_pic" => $picId));
            }
        }
        echo 1;
    }

    public function updatePwd() {
        $this->load->model("User_model");
        $user = $this->User_model->findById($this->_loggedUser->id);
        if ($this->input->post("pwdlama") == $this->encrypt->decode($user->password)) {
            $this->User_model->updateById($user->id, Array("password" => $this->encrypt->encode($this->input->post("pwdbaru"))));
            redirect("home");
        } else {
            redirect("home");
        }
    }

    public function detail() {
        $this->_data["pageTitle"] = "Detail";
        $this->_renderPage("profil/detail");
    }

    public function password() {
        $this->_data["pageTitle"] = "Pengaturan Password";
        $this->_renderPage("profil/password");
    }

    // ARTIKEL

    public function addArtikel($type) {
        $this->_data["useEditor"] = true;
        $this->load->model("Artikel_model");
        $type = strtoupper($type);
        $this->_data["type"] = $type;
        switch ($type) {
            case Artikel_model::TYPE_BERITA :
                $authorized = Array("berita_contributor");
                if ($this->isAuth($authorized)) {
                    $this->_data["pageTitle"] = "Input Berita PS";
                    $this->_renderpage("berita/add");
                } else {
                    redirect("home/error");
                }
                break;
            case Artikel_model::TYPE_KABAR_RELAWAN :
                $authorized = Array("kr_contributor");
                if ($this->isAuth($authorized)) {
                    $this->_data["pageTitle"] = "Tulis Kabar Relawan";
                    $this->_renderpage("kr/add");
                } else {
                    redirect("home/error");
                }
                break;
            case Artikel_model::TYPE_PUBLIK :
                $authorized = Array("pj_contributor");
                if ($this->isAuth($authorized)) {
                    $this->_data["pageTitle"] = "Tulis Artikel";
                    $this->_renderpage("pj/add");
                } else {
                    redirect("home/error");
                }
                break;
            default:
                redirect("home/error");
                break;
        }
    }

    public function historyArtikel($type) {
        $this->load->model("Artikel_model");
        $type = strtoupper($type);
        $this->_data["type"] = $type;
        switch ($type) {
            case Artikel_model::TYPE_BERITA :
                $authorized = Array("berita_contributor");
                if ($this->isAuth($authorized)) {
                    $this->_data["pageTitle"] = "History Entry Berita";

                    $this->load->model("Artikel_model");
                    $artikelList = $this->Artikel_model->beritaByPoster($this->_loggedUser->id, true);
                    $this->_data["artikelList"] = $artikelList;

                    $this->_renderPage("berita/history");
                } else {
                    redirect("home/error");
                }
                break;
            case Artikel_model::TYPE_KABAR_RELAWAN :
                $authorized = Array("kr_contributor");
                if ($this->isAuth($authorized)) {
                    $this->_data["pageTitle"] = "History Entry Artikel";

                    $this->load->model("Artikel_model");
                    $artikelList = $this->Artikel_model->krByPoster($this->_loggedUser->id, true);
                    $this->_data["artikelList"] = $artikelList;

                    $this->_renderPage("kr/history");
                } else {
                    redirect("home/error");
                }
                break;
            case Artikel_model::TYPE_PUBLIK :
                $authorized = Array("pj_contributor");
                if ($this->isAuth($authorized)) {
                    $this->_data["pageTitle"] = "History Entry Artikel";

                    $this->load->model("Artikel_model");
                    $artikelList = $this->Artikel_model->pjByPoster($this->_loggedUser->id, true);
                    $this->_data["artikelList"] = $artikelList;

                    $this->_renderPage("pj/history");
                } else {
                    redirect("home/error");
                }
                break;
            default:
                redirect("home/error");
                break;
        }
    }

    public function auditArtikel($type) {
        $this->_data["useEditor"] = true;
        $this->load->model("Artikel_model");
        $type = strtoupper($type);
        $this->_data["type"] = $type;
        switch ($type) {
            case Artikel_model::TYPE_BERITA :
                $authorized = Array("berita_auditor");
                if ($this->isAuth($authorized)) {
                    $this->_data["pageTitle"] = "Audit Entry Berita";

                    $this->load->model("Artikel_model");
                    $artikelList = $this->Artikel_model->beritaAll(Array("is_approved" => false), true, 2);
                    $this->_data["artikelList"] = $artikelList;

                    $this->_renderPage("berita/audit");
                } else {
                    redirect("home/error");
                }
                break;
            case Artikel_model::TYPE_KABAR_RELAWAN :
                $authorized = Array("kr_auditor");
                if ($this->isAuth($authorized)) {
                    $this->_data["pageTitle"] = "Audit Entry Artikel";

                    $this->load->model("Artikel_model");
                    $artikelList = $this->Artikel_model->krAll(Array("is_approved" => false), true, 2);
                    $this->_data["artikelList"] = $artikelList;

                    $this->_renderPage("kr/audit");
                } else {
                    redirect("home/error");
                }
                break;
            case Artikel_model::TYPE_PUBLIK :
                $authorized = Array("pj_auditor");
                if ($this->isAuth($authorized)) {
                    $this->_data["pageTitle"] = "Audit Entry Artikel";

                    $this->load->model("Artikel_model");
                    $artikelList = $this->Artikel_model->pjAll(Array("is_approved" => false), true, 2);
                    $this->_data["artikelList"] = $artikelList;

                    $this->_renderPage("pj/audit");
                } else {
                    redirect("home/error");
                }
                break;
            default:
                redirect("home/error");
                break;
        }
    }

    public function hlArtikel($type) {
        $this->load->model("Artikel_model");
        $type = strtoupper($type);
        $this->_data["type"] = $type;
        switch ($type) {
            case Artikel_model::TYPE_BERITA :
                $authorized = Array("berita_auditor");
                if ($this->isAuth($authorized)) {
                    $this->_data["pageTitle"] = "Pengaturan Highlight Berita";
                    $artikelList = $this->Artikel_model->beritaAll(Array("is_approved" => true), true, 2);
                    $this->_data["artikelList"] = $artikelList;
                    // hlList
                    $hlBerita = $this->Artikel_model->beritaHL();
                    $this->_data["hlBerita"] = $hlBerita;
                    $this->_renderPage("berita/hlselect");
                } else {
                    redirect("home/error");
                }
                break;
            case Artikel_model::TYPE_KABAR_RELAWAN :
                $authorized = Array("kr_auditor");
                if ($this->isAuth($authorized)) {
                    $this->_data["pageTitle"] = "Pengaturan Highlight Artikel";
                    $artikelList = $this->Artikel_model->krAll(Array("is_approved" => true), true, 2);
                    $this->_data["artikelList"] = $artikelList;
                    $hlList = $this->Artikel_model->krHL();
                    $this->_data["hlList"] = $hlList;
                    $this->_renderPage("kr/hlselect");
                } else {
                    redirect("home/error");
                }
                break;
            case Artikel_model::TYPE_PUBLIK :
                $authorized = Array("pj_auditor");
                if ($this->isAuth($authorized)) {
                    $this->_data["pageTitle"] = "Pengaturan Highlight Artikel";
                    $artikelList = $this->Artikel_model->pjAll(Array("is_approved" => true), true, 2);
                    $this->_data["artikelList"] = $artikelList;
                    $hlList = $this->Artikel_model->pjHL();
                    $this->_data["hlList"] = $hlList;
                    $this->_renderPage("pj/hlselect");
                } else {
                    redirect("home/error");
                }
                break;
            default:
                redirect("home/error");
                break;
        }
    }

    public function editArtikel($type) {
        $this->load->model("Artikel_model");
        $this->_data["useEditor"] = true;
        $authorized = Array("master_admin");
        if ($this->isAuth($authorized)) {
            $type = strtoupper($type);
            $this->_data["type"] = $type;
            switch ($type) {
                case Artikel_model::TYPE_BERITA :
                    $this->_data["pageTitle"] = "Edit Entry Berita";

                    $this->load->model("Artikel_model");
                    $artikelList = $this->Artikel_model->beritaAll(Array("is_approved" => true), true, 2);
                    $this->_data["artikelList"] = $artikelList;

                    $this->_renderPage("berita/edit");
                    break;
                case Artikel_model::TYPE_KABAR_RELAWAN :
                    $this->_data["pageTitle"] = "Edit Entry Artikel";

                    $this->load->model("Artikel_model");
                    $artikelList = $this->Artikel_model->krAll(Array("is_approved" => true), true, 2);
                    $this->_data["artikelList"] = $artikelList;

                    $this->_renderPage("kr/edit");
                    break;
                case Artikel_model::TYPE_PUBLIK :
                    $this->_data["pageTitle"] = "Edit Entry Artikel";

                    $this->load->model("Artikel_model");
                    $artikelList = $this->Artikel_model->pjAll(Array("is_approved" => true), true, 2);
                    $this->_data["artikelList"] = $artikelList;

                    $this->_renderPage("pj/edit");
                    break;
                default:
                    redirect("home/error");
                    break;
            }
        } else {
            redirect("home/error");
        }
    }

    // KEGIATAN

    public function addkegiatan() {
        $this->_data["useEditor"] = true;
        $authorized = Array("kegiatan_contributor");
        if ($this->isAuth($authorized)) {
            $this->_data["pageTitle"] = "Input Data Kegiatan";
            $this->_renderpage("kegiatan/add");
        } else {
            redirect("home/error");
        }
    }

    public function addberitakegiatan() {
        $this->_data["useEditor"] = true;
        $authorized = Array("kegiatan_contributor");
        if ($this->isAuth($authorized)) {
            $this->_data["pageTitle"] = "Input Berita Kegiatan";
            $this->_renderPage("kegiatan/addberita");
        } else {
            redirect("home/error");
        }
    }

    public function historykegiatan() {
        $authorized = Array("kegiatan_contributor");
        if ($this->isAuth($authorized)) {
            $this->_data["pageTitle"] = "History Entry Kegiatan";

            $this->load->model("Kegiatan_model");
            $kegiatanList = $this->Kegiatan_model->searchByPoster($this->_loggedUser->id, true);
            $this->_data["kegiatanList"] = $kegiatanList;

            $this->load->model("Beritakegiatan_model");
            $beritaList = $this->Beritakegiatan_model->searchByPoster($this->_loggedUser->id, true, 2);
            $this->_data["beritaList"] = $beritaList;

            $this->_renderPage("kegiatan/history");
        } else {
            redirect("home/error");
        }
    }

    public function auditkegiatan() {
        $this->_data["useEditor"] = true;
        $authorized = Array("kegiatan_auditor");
        if ($this->isAuth($authorized)) {
            $this->_data["pageTitle"] = "Audit Entry Kegiatan";

            $this->load->model("Kegiatan_model");
            $kegiatanList = $this->Kegiatan_model->findAll(Array("is_approved" => false), true, 2);
            $this->_data["kegiatanList"] = $kegiatanList;

            $this->load->model("Beritakegiatan_model");
            $beritaList = $this->Beritakegiatan_model->findAll(Array("is_approved" => false), true, 2);
            $this->_data["beritaList"] = $beritaList;

            $this->_renderPage("kegiatan/audit");
        } else {
            redirect("home/error");
        }
    }

    public function hlkegiatan() {
        $this->_data["useSlideShow"] = true;
        $authorized = Array("kegiatan_auditor");
        if ($this->isAuth($authorized)) {
            $this->_data["pageTitle"] = "Pengaturan Highlight Kegiatan";

            $this->load->model("Kegiatan_model");
            $kegiatanList = $this->Kegiatan_model->findAll(Array("is_approved" => true), true, 2);
            $this->_data["kegiatanList"] = $kegiatanList;
            $hlKegiatans = $this->Kegiatan_model->fetchHL();
            $this->_data["hlKegiatans"] = $hlKegiatans;

            $this->_renderPage("kegiatan/hlselect");
        } else {
            redirect("home/error");
        }
    }

    public function editkegiatan() {
        $this->_data["useEditor"] = true;
        $authorized = Array("master_admin");
        if ($this->isAuth($authorized)) {
            $this->_data["pageTitle"] = "Edit Entry Kegiatan";

            $this->load->model("Kegiatan_model");
            $kegiatanList = $this->Kegiatan_model->findAll(Array("is_approved" => true), true, 2);
            $this->_data["kegiatanList"] = $kegiatanList;

            $this->load->model("Beritakegiatan_model");
            $beritaList = $this->Beritakegiatan_model->findAll(Array("is_approved" => true), true, 2);
            $this->_data["beritaList"] = $beritaList;

            $this->_renderPage("kegiatan/edit");
        } else {
            redirect("home/error");
        }
    }

    // GALERI
    public function uploadgal($type) {
        $authorized = Array("gal_contributor");
        if ($this->isAuth($authorized)) {
            switch ($type) {
                case "img" :
                    $this->_data["useEditor"] = true;
                    $this->_renderPage("galeri/uploadimage");
                    break;
                case "vid" :
                    $this->_data["useEditor"] = true;
                    $this->_renderPage("galeri/uploadvideo");
                    break;
            }
        } else {
            redirect("home/error");
        }
    }

    public function historygal() {
        $authorized = Array("gal_contributor");
        if ($this->isAuth($authorized)) {
            $this->_data["pageTitle"] = "History entry galeri";
            $this->load->model("Gallery_model");
            $this->_data["galList"] = $this->Gallery_model->fetchHistory();
            $this->_renderPage("galeri/history");
        } else {
            redirect("home/error");
        }
    }

    public function auditgal() {
        $authorized = Array("gal_auditor");
        if ($this->isAuth($authorized)) {
            $this->_data["pageTitle"] = "Audit entry galeri";
            $this->load->model("Gallery_model");
            $this->_data["galList"] = $this->Gallery_model->fetchPending();
            $this->_renderPage("galeri/audit");
        } else {
            redirect("home/error");
        }
    }

    public function editgal() {
        $authorized = Array("gal_auditor", "master_admin");
        if ($this->isAuth($authorized)) {
            $this->_data["pageTitle"] = "Hapus entry galeri";
            $this->_renderPage("galeri/edit");
        } else {
            redirect("home/error");
        }
    }

    public function hlgal() {
        $authorized = Array("gal_auditor");
        if ($this->isAuth($authorized)) {
            $this->_data["pageTitle"] = "Pilih higlight galeri";
            $this->_renderPage("galeri/hl");
        } else {
            redirect("home/error");
        }
    }

    // PUBLIKASI

    public function addpub($type) {
        switch ($type) {
            case "buletin" :
                $this->_data["pageTitle"] = "Upload Buletin";
                $this->_renderPage("buletin/add");
                return;
        }
        redirect("home/error");
    }

    public function managepub($type) {
        switch ($type) {
            case "buletin" :
                $this->_data["pageTitle"] = "Manage Buletin";
                $this->_renderPage("buletin/manage");
                return;
        }
        redirect("home/error");
    }

    // ENTRYPS
    public function data($subpage) {
        switch ($subpage) {
            case "entry":
                $authorized = Array("data_entry");
                if ($this->isAuth($authorized)) {
                    $this->_data["pageTitle"] = "Data Entry";
                } else {
                    redirect("home/error");
                }
                break;
            case "indicator":
                $authorized = Array("data_master");
                if ($this->isAuth($authorized)) {
                    $this->_data["pageTitle"] = "Pengaturan Indikator";
                    $this->load->model("de_indicator_model");
                    $rootIndicator = $this->de_indicator_model->findById(0);
                    $this->_data["rootIndicator"] = $rootIndicator;
                } else {
                    redirect("home/error");
                }
                break;
            case "form":
                $authorized = Array("data_master");
                if ($this->isAuth($authorized)) {
                    $this->_data["pageTitle"] = "Pengaturan Form Data Entry";
                } else {
                    redirect("home/error");
                }
                break;
            case "spasial" :
                $this->_data["useEditor"] = true;
                $authorized = Array("data_entry");
                if ($this->isAuth($authorized)) {
                    $this->_data["pageTitle"] = "Spasial";
                } else {
                    redirect("home/error");
                }
                break;
            default :
                redirect("home/error");
                break;
        }
        $this->_renderPage("data/" . $subpage);
    }

    public function getIndicatorChilds($parentId) {
        $this->load->model("de_indicator_model");
        echo json_encode($this->de_indicator_model->findAll(Array("parent_id" => $parentId)));
    }

    public function getIndicatorJSON($id) {
        $this->load->model("de_indicator_model");
        echo json_encode($this->de_indicator_model->findById($id));
    }

    public function createIndicator() {
        $authorized = Array("data_master");
        if ($this->isAuth($authorized)) {
            $this->load->model("de_indicator_model");
            $name = $this->input->post("name");
            $hasValue = $this->input->post("has_value");
            $metric = $this->input->post("metric");
            $desc = $this->input->post("desc");
            $parentId = $this->input->post("parent_id");
            $indId = $this->de_indicator_model->create(
                    $name, $hasValue, $metric, $desc, $parentId);
            echo json_encode($this->de_indicator_model->findById($indId));
        } else {
            echo "";
        }
    }

    public function updateIndicator() {
        $authorized = Array("data_master");
        if ($this->isAuth($authorized)) {
            $this->load->model("de_indicator_model");
            $id = $this->input->post("id");
            $name = $this->input->post("name");
            $hasValue = $this->input->post("has_value");
            $metric = $this->input->post("metric");
            $desc = $this->input->post("desc");
            //$parentId = $this->input->post("parent_id");
            $indId = $this->de_indicator_model->updateById($id, $data = Array(
                "name" => $name,
                "has_value" => $hasValue,
                "metric" => $metric,
                "desc" => $desc,
                    //"parent_id" => $parentId
            ));
            $result = $this->de_indicator_model->findById($indId);
            echo json_encode($result);
        } else {
            echo "";
        }
    }

    public function deleteIndicator($indicatorId) {
        $authorized = Array("data_master");
        if ($this->isAuth($authorized)) {
            $this->load->model("de_indicator_model");
            echo $this->de_indicator_model->deleteById($indicatorId);
        } else {
            echo 0;
        }
    }

    public function getIndicatorTreeJSON() {
        $authorized = Array("data_master");
        if ($this->isAuth($authorized)) {
            $this->load->model("de_indicator_model");
            echo json_encode($this->de_indicator_model->getTreeJSON(0));
        } else {
            echo "";
        }
    }

    public function indicatortree() {
        $authorized = Array("data_master");
        if ($this->isAuth($authorized)) {
            $this->load->view("usercp/data/presentation/indicatortree");
        } else {
            redirect("home/error");
        }
    }

    public function testIndTreeJSON() {
        echo '
            {
 "name": "flare",
 "children": [
  {
   "name": "analytics",
   "children": [
    {
     "name": "cluster",
     "children": [
      {"name": "AgglomerativeCluster", "size": 3938},
      {"name": "CommunityStructure", "size": 3812},
      {"name": "HierarchicalCluster", "size": 6714},
      {"name": "MergeEdge", "size": 743}
     ]
    },
    {
     "name": "graph",
     "children": [
      {"name": "BetweennessCentrality", "size": 3534},
      {"name": "LinkDistance", "size": 5731},
      {"name": "MaxFlowMinCut", "size": 7840},
      {"name": "ShortestPaths", "size": 5914},
      {"name": "SpanningTree", "size": 3416}
     ]
    },
    {
     "name": "optimization",
     "children": [
      {"name": "AspectRatioBanker", "size": 7074}
     ]
    }
   ]
  },
  {
   "name": "animate",
   "children": [
    {"name": "Easing", "size": 17010},
    {"name": "FunctionSequence", "size": 5842},
    {
     "name": "interpolate",
     "children": [
      {"name": "ArrayInterpolator", "size": 1983},
      {"name": "ColorInterpolator", "size": 2047},
      {"name": "DateInterpolator", "size": 1375},
      {"name": "Interpolator", "size": 8746},
      {"name": "MatrixInterpolator", "size": 2202},
      {"name": "NumberInterpolator", "size": 1382},
      {"name": "ObjectInterpolator", "size": 1629},
      {"name": "PointInterpolator", "size": 1675},
      {"name": "RectangleInterpolator", "size": 2042}
     ]
    },
    {"name": "ISchedulable", "size": 1041},
    {"name": "Parallel", "size": 5176},
    {"name": "Pause", "size": 449},
    {"name": "Scheduler", "size": 5593},
    {"name": "Sequence", "size": 5534},
    {"name": "Transition", "size": 9201},
    {"name": "Transitioner", "size": 19975},
    {"name": "TransitionEvent", "size": 1116},
    {"name": "Tween", "size": 6006}
   ]
  },
  {
   "name": "data",
   "children": [
    {
     "name": "converters",
     "children": [
      {"name": "Converters", "size": 721},
      {"name": "DelimitedTextConverter", "size": 4294},
      {"name": "GraphMLConverter", "size": 9800},
      {"name": "IDataConverter", "size": 1314},
      {"name": "JSONConverter", "size": 2220}
     ]
    },
    {"name": "DataField", "size": 1759},
    {"name": "DataSchema", "size": 2165},
    {"name": "DataSet", "size": 586},
    {"name": "DataSource", "size": 3331},
    {"name": "DataTable", "size": 772},
    {"name": "DataUtil", "size": 3322}
   ]
  },
  {
   "name": "display",
   "children": [
    {"name": "DirtySprite", "size": 8833},
    {"name": "LineSprite", "size": 1732},
    {"name": "RectSprite", "size": 3623},
    {"name": "TextSprite", "size": 10066}
   ]
  },
  {
   "name": "flex",
   "children": [
    {"name": "FlareVis", "size": 4116}
   ]
  },
  {
   "name": "physics",
   "children": [
    {"name": "DragForce", "size": 1082},
    {"name": "GravityForce", "size": 1336},
    {"name": "IForce", "size": 319},
    {"name": "NBodyForce", "size": 10498},
    {"name": "Particle", "size": 2822},
    {"name": "Simulation", "size": 9983},
    {"name": "Spring", "size": 2213},
    {"name": "SpringForce", "size": 1681}
   ]
  },
  {
   "name": "query",
   "children": [
    {"name": "AggregateExpression", "size": 1616},
    {"name": "And", "size": 1027},
    {"name": "Arithmetic", "size": 3891},
    {"name": "Average", "size": 891},
    {"name": "BinaryExpression", "size": 2893},
    {"name": "Comparison", "size": 5103},
    {"name": "CompositeExpression", "size": 3677},
    {"name": "Count", "size": 781},
    {"name": "DateUtil", "size": 4141},
    {"name": "Distinct", "size": 933},
    {"name": "Expression", "size": 5130},
    {"name": "ExpressionIterator", "size": 3617},
    {"name": "Fn", "size": 3240},
    {"name": "If", "size": 2732},
    {"name": "IsA", "size": 2039},
    {"name": "Literal", "size": 1214},
    {"name": "Match", "size": 3748},
    {"name": "Maximum", "size": 843},
    {
     "name": "methods",
     "children": [
      {"name": "add", "size": 593},
      {"name": "and", "size": 330},
      {"name": "average", "size": 287},
      {"name": "count", "size": 277},
      {"name": "distinct", "size": 292},
      {"name": "div", "size": 595},
      {"name": "eq", "size": 594},
      {"name": "fn", "size": 460},
      {"name": "gt", "size": 603},
      {"name": "gte", "size": 625},
      {"name": "iff", "size": 748},
      {"name": "isa", "size": 461},
      {"name": "lt", "size": 597},
      {"name": "lte", "size": 619},
      {"name": "max", "size": 283},
      {"name": "min", "size": 283},
      {"name": "mod", "size": 591},
      {"name": "mul", "size": 603},
      {"name": "neq", "size": 599},
      {"name": "not", "size": 386},
      {"name": "or", "size": 323},
      {"name": "orderby", "size": 307},
      {"name": "range", "size": 772},
      {"name": "select", "size": 296},
      {"name": "stddev", "size": 363},
      {"name": "sub", "size": 600},
      {"name": "sum", "size": 280},
      {"name": "update", "size": 307},
      {"name": "variance", "size": 335},
      {"name": "where", "size": 299},
      {"name": "xor", "size": 354},
      {"name": "_", "size": 264}
     ]
    },
    {"name": "Minimum", "size": 843},
    {"name": "Not", "size": 1554},
    {"name": "Or", "size": 970},
    {"name": "Query", "size": 13896},
    {"name": "Range", "size": 1594},
    {"name": "StringUtil", "size": 4130},
    {"name": "Sum", "size": 791},
    {"name": "Variable", "size": 1124},
    {"name": "Variance", "size": 1876},
    {"name": "Xor", "size": 1101}
   ]
  },
  {
   "name": "scale",
   "children": [
    {"name": "IScaleMap", "size": 2105},
    {"name": "LinearScale", "size": 1316},
    {"name": "LogScale", "size": 3151},
    {"name": "OrdinalScale", "size": 3770},
    {"name": "QuantileScale", "size": 2435},
    {"name": "QuantitativeScale", "size": 4839},
    {"name": "RootScale", "size": 1756},
    {"name": "Scale", "size": 4268},
    {"name": "ScaleType", "size": 1821},
    {"name": "TimeScale", "size": 5833}
   ]
  },
  {
   "name": "util",
   "children": [
    {"name": "Arrays", "size": 8258},
    {"name": "Colors", "size": 10001},
    {"name": "Dates", "size": 8217},
    {"name": "Displays", "size": 12555},
    {"name": "Filter", "size": 2324},
    {"name": "Geometry", "size": 10993},
    {
     "name": "heap",
     "children": [
      {"name": "FibonacciHeap", "size": 9354},
      {"name": "HeapNode", "size": 1233}
     ]
    },
    {"name": "IEvaluable", "size": 335},
    {"name": "IPredicate", "size": 383},
    {"name": "IValueProxy", "size": 874},
    {
     "name": "math",
     "children": [
      {"name": "DenseMatrix", "size": 3165},
      {"name": "IMatrix", "size": 2815},
      {"name": "SparseMatrix", "size": 3366}
     ]
    },
    {"name": "Maths", "size": 17705},
    {"name": "Orientation", "size": 1486},
    {
     "name": "palette",
     "children": [
      {"name": "ColorPalette", "size": 6367},
      {"name": "Palette", "size": 1229},
      {"name": "ShapePalette", "size": 2059},
      {"name": "SizePalette", "size": 2291}
     ]
    },
    {"name": "Property", "size": 5559},
    {"name": "Shapes", "size": 19118},
    {"name": "Sort", "size": 6887},
    {"name": "Stats", "size": 6557},
    {"name": "Strings", "size": 22026}
   ]
  },
  {
   "name": "vis",
   "children": [
    {
     "name": "axis",
     "children": [
      {"name": "Axes", "size": 1302},
      {"name": "Axis", "size": 24593},
      {"name": "AxisGridLine", "size": 652},
      {"name": "AxisLabel", "size": 636},
      {"name": "CartesianAxes", "size": 6703}
     ]
    },
    {
     "name": "controls",
     "children": [
      {"name": "AnchorControl", "size": 2138},
      {"name": "ClickControl", "size": 3824},
      {"name": "Control", "size": 1353},
      {"name": "ControlList", "size": 4665},
      {"name": "DragControl", "size": 2649},
      {"name": "ExpandControl", "size": 2832},
      {"name": "HoverControl", "size": 4896},
      {"name": "IControl", "size": 763},
      {"name": "PanZoomControl", "size": 5222},
      {"name": "SelectionControl", "size": 7862},
      {"name": "TooltipControl", "size": 8435}
     ]
    },
    {
     "name": "data",
     "children": [
      {"name": "Data", "size": 20544},
      {"name": "DataList", "size": 19788},
      {"name": "DataSprite", "size": 10349},
      {"name": "EdgeSprite", "size": 3301},
      {"name": "NodeSprite", "size": 19382},
      {
       "name": "render",
       "children": [
        {"name": "ArrowType", "size": 698},
        {"name": "EdgeRenderer", "size": 5569},
        {"name": "IRenderer", "size": 353},
        {"name": "ShapeRenderer", "size": 2247}
       ]
      },
      {"name": "ScaleBinding", "size": 11275},
      {"name": "Tree", "size": 7147},
      {"name": "TreeBuilder", "size": 9930}
     ]
    },
    {
     "name": "events",
     "children": [
      {"name": "DataEvent", "size": 2313},
      {"name": "SelectionEvent", "size": 1880},
      {"name": "TooltipEvent", "size": 1701},
      {"name": "VisualizationEvent", "size": 1117}
     ]
    },
    {
     "name": "legend",
     "children": [
      {"name": "Legend", "size": 20859},
      {"name": "LegendItem", "size": 4614},
      {"name": "LegendRange", "size": 10530}
     ]
    },
    {
     "name": "operator",
     "children": [
      {
       "name": "distortion",
       "children": [
        {"name": "BifocalDistortion", "size": 4461},
        {"name": "Distortion", "size": 6314},
        {"name": "FisheyeDistortion", "size": 3444}
       ]
      },
      {
       "name": "encoder",
       "children": [
        {"name": "ColorEncoder", "size": 3179},
        {"name": "Encoder", "size": 4060},
        {"name": "PropertyEncoder", "size": 4138},
        {"name": "ShapeEncoder", "size": 1690},
        {"name": "SizeEncoder", "size": 1830}
       ]
      },
      {
       "name": "filter",
       "children": [
        {"name": "FisheyeTreeFilter", "size": 5219},
        {"name": "GraphDistanceFilter", "size": 3165},
        {"name": "VisibilityFilter", "size": 3509}
       ]
      },
      {"name": "IOperator", "size": 1286},
      {
       "name": "label",
       "children": [
        {"name": "Labeler", "size": 9956},
        {"name": "RadialLabeler", "size": 3899},
        {"name": "StackedAreaLabeler", "size": 3202}
       ]
      },
      {
       "name": "layout",
       "children": [
        {"name": "AxisLayout", "size": 6725},
        {"name": "BundledEdgeRouter", "size": 3727},
        {"name": "CircleLayout", "size": 9317},
        {"name": "CirclePackingLayout", "size": 12003},
        {"name": "DendrogramLayout", "size": 4853},
        {"name": "ForceDirectedLayout", "size": 8411},
        {"name": "IcicleTreeLayout", "size": 4864},
        {"name": "IndentedTreeLayout", "size": 3174},
        {"name": "Layout", "size": 7881},
        {"name": "NodeLinkTreeLayout", "size": 12870},
        {"name": "PieLayout", "size": 2728},
        {"name": "RadialTreeLayout", "size": 12348},
        {"name": "RandomLayout", "size": 870},
        {"name": "StackedAreaLayout", "size": 9121},
        {"name": "TreeMapLayout", "size": 9191}
       ]
      },
      {"name": "Operator", "size": 2490},
      {"name": "OperatorList", "size": 5248},
      {"name": "OperatorSequence", "size": 4190},
      {"name": "OperatorSwitch", "size": 2581},
      {"name": "SortOperator", "size": 2023}
     ]
    },
    {"name": "Visualization", "size": 16540}
   ]
  }
 ]
}
            ';
    }

}